// 给定一个包含 0 和 1 的二维网格地图，其中 1 表示陆地 0 表示水域。
// 网格中的格子水平和垂直方向相连（对角线方向不相连）。
// 整个网格被水完全包围，但其中恰好有一个岛屿（或者说，一个或多个表示陆地的格子相连组成的岛屿）。
// 岛屿中没有“湖”（“湖” 指水域在岛屿内部且不和岛屿周围的水相连）。
// 格子是边长为 1 的正方形。网格为长方形，且宽度和高度均不超过 100 。计算这个岛屿的周长。


const islandPerimeter = function (grid: number[][]): number {
    // 安全检测
    if (grid.length === 0) {
        return 0;
    }
    let res: number = 0; // 结果周长
    const vectors: number[][] = [
        [1, 0],
        [-1, 0],
        [0, 1],
        [0, -1]
    ]; // 方向向量
    for (let i = 0; i < grid.length; i++) {
        for (let j = 0; j < grid[0].length; j++) {
            // 判断是否是陆地
            if (grid[i][j] === 1) {
                for (let vector of vectors) {
                    let currX = i + vector[0];// 当前X坐标
                    let currY = j + vector[1];// 当前Y坐标
                    // 检测是否越界，如果越界的话也需要统计进周长
                    if (currX < 0 || currX >= grid.length || currY < 0 || currY >= grid[0].length) {
                        res++;
                        continue;
                    }
                    // 判断当前格子是否位于岸边
                    if (grid[currX][currY] === 0) {
                        res++;
                    }
                }
            }
        }
    }
    return res;
};


// 这道题目其实也是一道看着困难但其实仔细思考并不复杂的题目
// 怎么计算陆地的周长呢？其实要考虑的只有是矩阵当前值是陆地的时候
// 如果是陆地的话，就先用方向向量算出当前坐标
// 如果当前位置越界的话肯定要统计进周长，然后因为越界直接回到循环
// 如果当前位置合理的话就判断是否在岸边，如果位于岸边的话周长加1
// 其实也就上述两种情况需要统计周长，把矩阵完整的走完一遍即可得到周长。
